package world.controllers

import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.After
import org.aspectj.lang.annotation.AfterReturning
import org.aspectj.lang.annotation.AfterThrowing
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.Pointcut
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component

@Component
@Aspect
class UserAspect {

    def log = LoggerFactory.getLogger(this.class) //日志

    /**
     * JoinPoint连接点（可切入点） -> Pointcut切入点（execution表达式）
     * Advice通知（通知类型有Before、AfterReturning、AfterThrowing、After等）
     * Aspect切面（被切开的面）
     */

    @Pointcut("execution(* world.controllers.UserController.*(..))") //切入点“返回值 类路径.方法名(参数)”。例如，返回值*，类路径world.controllers.UserController，方法名*，参数(..)，简单理解，就是将UserController下的所有方法都定为切入点。
    def methodExecution(){} //狼来了

    @Before("methodExecution()")
    void before(JoinPoint joinPoint){
        log.warn("控制器方法执行前...${joinPoint}") //警报，御敌
    }

    @After("methodExecution()")
    void after(JoinPoint joinPoint) {
        log.warn("控制器方法执行后...${joinPoint}") //警报，解除
    }

}
